package kyo;

//I 代表条目信息类型
//D 代表条目操作数据类型
public class Item<I, D> {
    //条目ID, 自动生成，也不允许重复
    private int id = 1;
    //条目信息, 不允许重复
    private I info = null;
    //此条目的子条目列表
    private Menu<I, D> subMenu = null;
    // private List<Item<T>> subItem;
    //条目操作, 可以为null, 交于菜单类统一处理
    private ItemRun iRun = null;
    //条目操作数据, 可以为null代表没有操作数据
    private D runData = null;

    public Item() {
        this(null, null, null);
    }

    public Item(int id) {
        this(id, null, null, null);
    }

    public Item(I info) {
        this(info, null, null);
    }

    public Item(int id, I info) {
        this(id, info, null, null);
    }

    public Item(I info, ItemRun iRun) {
        this(info, iRun, null);
    }

    public Item(int id, I info, ItemRun iRun) {
        this(id, info, iRun, null);
    }

    public Item(I info, Menu<I, D> subMenu) {
        set(info, subMenu);
    }

    public Item(int id, I info, Menu<I, D> subMenu) {
        set(id, info, subMenu);
    }

    public Item(I info, ItemRun iRun, D runData) {
        set(info, iRun, runData);
    }

    public Item(int id, I info, ItemRun iRun, D runData) {
        set(id, info, iRun, runData);
    }

    public Item<I, D> set(int id, I info, ItemRun iRun, D runData) {
        setId(id);
        set(info);
        setRun(iRun);
        setData(runData);
        return this;
    }

    public Item<I, D> set(I info, ItemRun iRun, D runData) {
        set(info);
        setRun(iRun);
        setData(runData);
        return this;
    }

    public Item<I, D> set(int id, I info, Menu<I, D> subMenu) {
        setId(id);
        set(info);
        setSubMenu(subMenu);
        return this;
    }

    public Item<I, D> set(I info, Menu<I, D> subMenu) {
        set(info);
        setSubMenu(subMenu);
        return this;
    }

    public Item<I, D> set(ItemRun iRun, D runData) {
        setRun(iRun);
        setData(runData);
        return this;
    }

    public Item<I, D> setSubMenu(Menu<I, D> subMenu) {
        this.subMenu = subMenu;
        return this;
    }

    public Item<I, D> setData(D runData) {
        this.runData = runData;
        return this;
    }

    public Item<I, D> setRun(ItemRun iRun) {
        this.iRun = iRun;
        return this;
    }

    public Item<I, D> setId(int id) {
        this.id = id;
        return this;
    }

    public Item<I, D> set(I info) {
        this.info = info;
        return this;
    }

    public boolean isSubMenu() {
        return (subMenu != null) ? true : false;
    }

    public int getId() {
        return id;
    }

    public I getInfo() {
        return info;
    }

    public D getData() {
        return runData;
    }

    public Menu<I, D> getSubMenu() {
        return subMenu;
    }

    public ItemRun getRun() {
        return iRun;
    }

    public String toString() {
        return "".format("%d.%s", id, info);
    }

    public boolean equals(Object o) {
        if (o instanceof Item) {
            return info.equals(((Item)o).getInfo());
        }
        return false;
    }

    public RunState run() {
        return iRun.run(this);
    }
}

